<?php
/**
 * Created by PhpStorm.
 * @description:
 * @time:
 * @Author: yfl
 * @QQ 554665488
 * Date: 2018-5-26
 * Time: 0:05
 */
//异步执行任务
//swoole 提供了异步执行任务处理的功能。可以从投递一个异步任务到taskWorker 进程池中执行，不影响当前的请求速度

//基于Tcp服务器 只需要增加onTask和onFinish2个事件回调函数即可另外还需要设置task进程数量，可以根据任务的耗时时间和任务量来配置适量task进程
$server = new  swoole_server('0.0.0.0', 9505);
//设置异步执行任务工作的进程数量
$server->set(
    [
        'task_worker_num' => 4
    ]
);
//监听客户端建立链接事件回调
$server->on('connect', function ($serv, $fd) {
    echo $fd . "客户端链接成功.\n";
});
//监听客户端发送的数据
$server->on('receive', function ($serv, $fd, $from_id, $packge) {
    //投递异步任务
    $len = unpack('N', $packge)[1];
    $data=substr($packge,-$len);
    $task_id = $serv->task($data);
//    echo '执行任务的ID==Async///id=' . $task_id.PHP_EOL;
    $serv->send($fd,'向客户端发送数据'.$packge);
});
//执行异步任务
$server->on('task', function ($serv, $task_id, $from_id, $task_data) {
//    echo '新的异步异步任务[id=' . $task_id . ']' . "\n";
        sleep(5);//假设执行异步的任务需要5s的时间
    $res='5546654878';// 执行完任务后的结果
    $serv->finish($res . '->ok');


});
$server->on('finish', function ($serv, $task_id, $end_task_data) {
    //    任务执行成功后的动作 比如修改数据库
    echo "AsyncTask[$task_id] Finish:$end_task_data" . "\n";

//   return $end_task_data;
});
//监听链接关闭事件
$server->on('close', function ($service, $fd) {
    echo "Client:close.\n";
});
$server->start();


//执行流程
//调用$serv->task()后程序会立即返回。继续向下执行代码。onTask回调函数task进程池的任务被异步执行，执行完成后调用finish方法的回调方法返回结果
// finish 是可选的也可以不返回结果




